//洛谷p4913
#include<stdio.h>
int t[1000001], dep[1000001]={0,1}; // t数组用来记录当前结点的的父节点
int depth(int i){
    if(dep[i] > 0){
            return dep[i];
        }
        return dep[i] = depth(t[i]) + 1;
}

int main(){
    int n,L,R;//n表示要输入数据的行数,L表示当前结点的的左孩子,R表示当前结点的右孩子
    scanf("%d",&n);

    for (int i = 1; i <= n ; i++){
        scanf("%d%d",&L,&R);
        if(L > 0){
            t[L] = i;
        }
        if(R > 0){
            t[R] = i;
        }
    }

    int max = 0, term = 0;//用来寻找最大深度
    for (int i = 1; i <= n;i++){
        term=depth(i);
        if(term>max){
            max = term;
        }
    }
    printf("%d",max);
}